x86/mca: MCA physical address check when calculate domain
authorLiu, Jinsong <jinsong.liu@intel.com>
Thu, 12 May 2011 07:52:18 +0000 (08:52 +0100)
committerLiu, Jinsong <jinsong.liu@intel.com>
Thu, 12 May 2011 07:52:18 +0000 (08:52 +0100)
Bank addr maybe invalid, or Bank addr maybe physical/memory/linear
address or segment offset.  This patch add mca
MCi_STATUS_MISCV/MCi_STATUS_ADDRV check, and add physical address
verify, so that it work safe when calculate domain.

Signed-off-by: Liu, Jinsong <jinsong.liu@intel.com>
xen/arch/x86/cpu/mcheck/mce.c

index 4f03ad6d8aba34e2c38a70f1bb09bf10d224dafc..8bd308d75ca39852d04fabcca48383cd580aa5d4 100644 (file)
@@ -151,7 +151,6 @@ static struct mcinfo_bank *mca_init_bank(enum mca_source who,
                                          struct mc_info *mi, int bank)
 {
     struct mcinfo_bank *mib;
-    uint64_t addr=0, misc = 0;
 
     if (!mi)
         return NULL;
@@ -170,22 +169,23 @@ static struct mcinfo_bank *mca_init_bank(enum mca_source who,
     mib->common.size = sizeof (struct mcinfo_bank);
     mib->mc_bank = bank;
 
-    addr = misc = 0;
     if (mib->mc_status & MCi_STATUS_MISCV)
         mib->mc_misc = mca_rdmsr(MSR_IA32_MCx_MISC(bank));
 
     if (mib->mc_status & MCi_STATUS_ADDRV)
-    {
         mib->mc_addr = mca_rdmsr(MSR_IA32_MCx_ADDR(bank));
 
-        if (mfn_valid(paddr_to_pfn(mib->mc_addr))) {
-            struct domain *d;
+    if ((mib->mc_status & MCi_STATUS_MISCV) &&
+        (mib->mc_status & MCi_STATUS_ADDRV) &&
+        ((mib->mc_misc & MCi_MISC_ADDRMOD_MASK) == MCi_MISC_PHYSMOD) && 
+        (who == MCA_POLLER || who == MCA_CMCI_HANDLER) &&
+        (mfn_valid(paddr_to_pfn(mib->mc_addr))))
+    {
+        struct domain *d;
 
-            d = maddr_get_owner(mib->mc_addr);
-            if (d != NULL && (who == MCA_POLLER ||
-                              who == MCA_CMCI_HANDLER))
-                mib->mc_domid = d->domain_id;
-        }
+        d = maddr_get_owner(mib->mc_addr);
+        if (d)
+            mib->mc_domid = d->domain_id;
     }
 
     if (who == MCA_CMCI_HANDLER) {